//
//  Autorelease.h
//  面试题
//
//  Created by Toj on 8/19/21.
//

#pragma mark - 问题?
1. 什么是 Autoreleasepool
2. Autoreleasepool 底层实现
3. 开发中用到的地方

#pragma mark - 1. 什么是 Autoreleasepool
自动释放池: Autoreleasepool, 延迟了对象的释放时间

你可以理解它是保存 对象 的一个池子


#pragma mark - 2. Autoreleasepool 底层实现
详细请看【Autoreleasepool底层实现.h】

其实内部实现是一个双向的链表
如果一个池子满了 利用双向链表特性创建建一个新池子并且指向它
释放也是如此

纠正一个错误理解
就是在 for遍历 的时候利用
for (int i = 0; i < 10; i++) {
    @autoreleasepool {
        NSString *str = @"";
    }
}

其实只是临时创建一个自动释放池, 当for结束就被释放了
他不会加入runloop内的自动释放池, 就好比一段代码 { } 当 } 结束后就被释放了

#pragma mark - 3. 开发中用到的地方
1. 是遍历内
for (int i = 0; i < 10; i++) {
    @autoreleasepool {
        NSString *str = @"";
    }
}

2. 长期在后台运行的任务

3. 创建新的线程任务

释放
指向栈顶的指针先pop
